home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
aminet
/
gfx
/
conv
/
r2g.lha
/
R2G.mod
< prev
Wrap
Text File
|
1992-10-11
|
6KB
|
202 lines
(************************************************************************************
* Programm : R2G *
* Version : 1.11 *
* Lenght : 14324 *
* *
* Datum : 10.10.92 *
* Autor : Jürgen Bernd *
* Compiler : AmigaOberon 2.13D *
* *
* Funktion : Dieses Programm ermöglicht es ein 2-Farb-Rasterbild (Zeitungsdruck) *
* in ein echtes 16-Graustufen-Bild zu konvertieren. Dies geschieht im *
* im Gegensatz zu WASP2.02B ohne Größenverlust. *
************************************************************************************)
MODULE R2G;
IMPORT
S : SYSTEM,
G : Graphics,
Is : IFFSupport,
I : Intuition,
N : NoGuru,
A : Arguments;
VAR
Count : INTEGER;
OldSP,NewSP : I.ScreenPtr;
OldRP : G.RastPortPtr;
wp : I.WindowPtr;
Name : ARRAY 20 OF CHAR;
Buffer : ARRAY 640 OF BYTE;
PROCEDURE OpenNewScreen();
VAR
k : INTEGER;
MyS : I.NewScreen;
VP : G.ViewPortPtr;
BEGIN
MyS.leftEdge := 0;
MyS.topEdge := 0;
MyS.width := OldSP^.width;
MyS.height := OldSP^.height;
MyS.depth := 4;
MyS.detailPen := 7;
MyS.blockPen := 0;
MyS.viewModes := OldSP^.viewPort.modes;
MyS.type := {};
MyS.font := NIL;
MyS.defaultTitle := NIL;
MyS.gadgets := NIL;
MyS.customBitMap := NIL;
NewSP := I.OpenScreen(MyS);
N.Assert(NewSP#NIL,"ERROR : can't open screen");
VP := S.ADR(NewSP^.viewPort);
k := 0;
WHILE k<16 DO
G.SetRGB4(VP,k,k,k,k);
INC(k);
END;
END OpenNewScreen;
PROCEDURE GetColor1(x,y : INTEGER) : INTEGER;
VAR
Color : LONGINT;
BEGIN
Color := 0;
INC(Color,G.ReadPixel(OldRP,x-1,y-1));
INC(Color,G.ReadPixel(OldRP,x-1,y));
INC(Color,G.ReadPixel(OldRP,x-1,y+1));
INC(Color,G.ReadPixel(OldRP,x,y-1));
INC(Color,G.ReadPixel(OldRP,x,y));
INC(Color,G.ReadPixel(OldRP,x,y+1));
INC(Color,G.ReadPixel(OldRP,x+1,y-1));
INC(Color,G.ReadPixel(OldRP,x+1,y));
INC(Color,G.ReadPixel(OldRP,x+1,y+1));
INC(Color,G.ReadPixel(OldRP,x,y-2));
INC(Color,G.ReadPixel(OldRP,x,y+2));
INC(Color,G.ReadPixel(OldRP,x+2,y));
INC(Color,G.ReadPixel(OldRP,x-2,y));
INC(Color,G.ReadPixel(OldRP,x+2,y-1));
INC(Color,G.ReadPixel(OldRP,x+2,y+1));
RETURN SHORT(Color);
END GetColor1;
PROCEDURE GetColor2(x,y : INTEGER) : INTEGER;
VAR
Color,Result : LONGINT;
BEGIN
Color := 0;
INC(Color,G.ReadPixel(OldRP,x-1,y-1));
INC(Color,G.ReadPixel(OldRP,x-1,y));
INC(Color,G.ReadPixel(OldRP,x-1,y+1));
INC(Color,G.ReadPixel(OldRP,x,y-1));
INC(Color,G.ReadPixel(OldRP,x,y));
INC(Color,G.ReadPixel(OldRP,x,y+1));
INC(Color,G.ReadPixel(OldRP,x+1,y-1));
INC(Color,G.ReadPixel(OldRP,x+1,y));
INC(Color,G.ReadPixel(OldRP,x+1,y+1));
Result := Color*3;
Color := 0;
INC(Color,G.ReadPixel(OldRP,x,y-2));
INC(Color,G.ReadPixel(OldRP,x,y+2));
INC(Color,G.ReadPixel(OldRP,x+2,y));
INC(Color,G.ReadPixel(OldRP,x-2,y));
INC(Color,G.ReadPixel(OldRP,x+2,y-1));
INC(Color,G.ReadPixel(OldRP,x+2,y+1));
INC(Color,G.ReadPixel(OldRP,x-2,y-2));
INC(Color,G.ReadPixel(OldRP,x-1,y-2));
INC(Color,G.ReadPixel(OldRP,x+1,y-2));
INC(Color,G.ReadPixel(OldRP,x+2,y-2));
INC(Color,G.ReadPixel(OldRP,x-2,y-1));
INC(Color,G.ReadPixel(OldRP,x-2,y+1));
INC(Color,G.ReadPixel(OldRP,x-2,y+2));
INC(Color,G.ReadPixel(OldRP,x-1,y+2));
INC(Color,G.ReadPixel(OldRP,x+1,y+2));
INC(Color,G.ReadPixel(OldRP,x+2,y+2));
INC(Result,Color*2);
INC(Result,G.ReadPixel(OldRP,x-3,y-3));
INC(Result,G.ReadPixel(OldRP,x-2,y-3));
INC(Result,G.ReadPixel(OldRP,x-1,y-3));
INC(Result,G.ReadPixel(OldRP,x,y-3));
INC(Result,G.ReadPixel(OldRP,x+1,y-3));
INC(Result,G.ReadPixel(OldRP,x+2,y-3));
INC(Result,G.ReadPixel(OldRP,x+3,y-3));
INC(Result,G.ReadPixel(OldRP,x-3,y-2));
INC(Result,G.ReadPixel(OldRP,x+3,y-2));
INC(Result,G.ReadPixel(OldRP,x-3,y-1));
INC(Result,G.ReadPixel(OldRP,x+3,y-1));
INC(Result,G.ReadPixel(OldRP,x-3,y));
INC(Result,G.ReadPixel(OldRP,x+3,y));
INC(Result,G.ReadPixel(OldRP,x+3,y+1));
INC(Result,G.ReadPixel(OldRP,x-3,y+1));
INC(Result,G.ReadPixel(OldRP,x-3,y+2));
INC(Result,G.ReadPixel(OldRP,x+3,y+2));
INC(Result,G.ReadPixel(OldRP,x-3,y+3));
INC(Result,G.ReadPixel(OldRP,x-2,y+3));
INC(Result,G.ReadPixel(OldRP,x-1,y+3));
INC(Result,G.ReadPixel(OldRP,x,y+3));
INC(Result,G.ReadPixel(OldRP,x+1,y+3));
INC(Result,G.ReadPixel(OldRP,x+2,y+3));
INC(Result,G.ReadPixel(OldRP,x+3,y+3));
RETURN SHORT(Result DIV 5);
END GetColor2;
PROCEDURE ConvertPic();
VAR
MaxX,MaxY,x,y : INTEGER;
NewRP : G.RastPortPtr;
Dummy : BOOLEAN;
BEGIN
OpenNewScreen();
MaxX := OldSP^.width-3;
MaxY := OldSP^.height-3;
OldRP := S.ADR(OldSP^.rastPort);
NewRP := S.ADR(NewSP^.rastPort);
IF Count=2 THEN
y := 2;
WHILE y<=MaxY DO
x := 2;
WHILE x<=MaxX DO
G.SetAPen(NewRP,GetColor1(x,y));
Dummy := G.WritePixel(NewRP,x,y);
INC(x);
END;
INC(y);
END;
ELSE
y := 3;
WHILE y<MaxY DO
x := 3;
WHILE x<MaxX DO
G.SetAPen(NewRP,GetColor2(x,y));
Dummy := G.WritePixel(NewRP,x,y);
INC(x);
END;
INC(y);
END;
END;
END ConvertPic;
PROCEDURE CleanUp();
BEGIN
IF OldSP#NIL THEN
I.OldCloseScreen(OldSP);
END;
IF NewSP#NIL THEN
I.OldCloseScreen(NewSP);
END;
END CleanUp;
BEGIN
Count := A.NumArgs();
N.Assert((Count=2) OR (Count=3),"SYNTAX : M2G [inputfile] [outputfile] <HIGH>");
A.GetArg(1,Name);
N.Assert(Is.ReadILBM(Name,{Is.front},OldSP,wp)=TRUE,"ERROR : can't load picture");
ConvertPic();
A.GetArg(2,Name);
N.Assert(Is.WriteILBMScreen(Name,NewSP,NIL,TRUE)=TRUE,"ERROR : can't save picture");
CLOSE
CleanUp();
END R2G.